今天做一個零相依、超短小工具:把指定資料夾的檔案清單匯出成 CSV。
支援:遞迴子資料夾、副檔名過濾、加上檔案雜湊(可選)。
程式碼(存成 ls_csv.py)
# ls_csv.py — 列出檔案清單到 CSV(可遞迴/過濾/可選雜湊)
from __future__ import annotations
import argparse, csv, hashlib, time
from pathlib import Path
from typing import Iterable, List
def iter_files(root: Path, recursive: bool, patterns: List[str] | None) -> Iterable[Path]:
pats = patterns or ["*"]
seen = set()
for pat in pats:
glob = root.rglob if recursive else root.glob
for p in glob(pat):
if p.is_file():
rp = p.resolve()
if rp not in seen:
seen.add(rp)
yield p
def file_hash(p: Path, algo="sha1", chunk=1024*1024) -> str:
h = hashlib.new(algo)
with p.open("rb") as f:
for b in iter(lambda: f.read(chunk), b""):
h.update(b)
return h.hexdigest()
def main():
ap = argparse.ArgumentParser(description="資料夾清單 ➜ CSV")
ap.add_argument("--src", type=Path, required=True, help="來源資料夾")
ap.add_argument("--recursive", action="store_true", help="包含子資料夾")
ap.add_argument("--match", nargs="*", help="過濾 pattern,如 '*.pdf' '*.jpg'")
ap.add_argument("--with-hash", action="store_true", help="額外輸出 SHA1 雜湊")
ap.add_argument("--out", type=Path, default=Path("exports/list.csv"), help="輸出 CSV 路徑")
args = ap.parse_args()
files = list(iter_files(args.src, args.recursive, args.match))
if not files:
print("找不到檔案(檢查 --match 或路徑)"); return
args.out.parent.mkdir(parents=True, exist_ok=True)
cols = ["path", "name", "ext", "size", "mtime"]
if args.with_hash: cols.append("sha1")
with args.out.open("w", encoding="utf-8", newline="") as f:
w = csv.DictWriter(f, fieldnames=cols); w.writeheader()
for i, p in enumerate(files, 1):
st = p.stat()
row = {
"path": str(p),
"name": p.stem,
"ext": p.suffix.lower(),
"size": st.st_size,
"mtime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(st.st_mtime)),
}
if args.with_hash: row["sha1"] = file_hash(p)
w.writerow(row)
if i % 200 == 0: print(f"...{i}/{len(files)}")
print(f"✅ 已輸出:{args.out}({len(files)} 筆)")
if __name__ == "__main__":
main()
怎麼用(PowerShell)
# 1) 列出目前資料夾所有檔案(不含子資料夾)
python .\ls_csv.py --src .
# 2) 遞迴列出所有 PDF、JPG,輸出到 exports\list_media.csv
python .\ls_csv.py --src . --recursive --match '*.pdf' '*.jpg' --out .\exports\list_media.csv
# 3) 需要雜湊欄位(較慢)
python .\ls_csv.py --src . --recursive --with-hash
實作:
小提醒
PowerShell 的萬用字元記得加引號:'.pdf'、'.jpg'
mtime 是最後修改時間;要改成建立時間可自行讀 st_ctime
加 --with-hash 會逐檔讀取計算雜湊,檔案多時會比較慢